/*
 * PedidoDAOImpl.java
 *
 * Created on 6 de Janeiro de 2008, 20:28
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.uff.javabasico.DAO;

import br.uff.javabasico.exception.BDException;
import br.uff.javabasico.modelos.Cliente;
import br.uff.javabasico.modelos.ItemPedido;
import br.uff.javabasico.modelos.Pedido;
import br.uff.javabasico.modelos.Produto;
import br.uff.javabasico.util.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author HelioKann
 */
public class PedidoDAOImpl {
    
    /** Creates a new instance of PedidoDAOImpl */
    public PedidoDAOImpl() {
    }
    
//    public static List<Pedido> getLista() throws BDException{
//        ArrayList<Pedido> lista = new ArrayList<Pedido>();
//
//        Pedido p = null;
//        PreparedStatement pstmt;
//        try {
//            pstmt = Conexao.getConnection().prepareStatement("select * from pedido");
//
//            ResultSet rs = pstmt.executeQuery();
//
//            while(rs.next()) {
//                p = new Pedido();
//                p.setFechado(rs.getBoolean("fechado"));
//                p.setId(rs.getInt("id"));
//                p.setIdCliente(rs.getInt("id_cliente"));
//
//                lista.add(p);
//            }
//
//        } catch (SQLException ex) {
////            ex.printStackTrace();
//            throw new BDException(ex);
//        }finally {
//            Conexao.close();
//        }
//        return lista;
//    }
    
    public static void incluir(Pedido p) throws BDException{
        PreparedStatement pstmt;
        try {
            pstmt = Conexao.getConnection().prepareStatement
                    ("insert into pedido (fechado, id_cliente) values (?,?)");
            
            pstmt.setBoolean(1,p.isFechado());
            pstmt.setInt(2,p.getCliente().getNumero());
            
            pstmt.execute();
            
        } catch (SQLException ex) {
            throw new BDException(ex);
        }finally {
            Conexao.close();
        }
    }
    
    public static void atualiza(Pedido p) throws BDException{
        PreparedStatement pstmt;
        try {
            pstmt = Conexao.getConnection().prepareStatement
                    ("Update pedido set fechado=? where id=?");
            
            pstmt.setBoolean(1, p.isFechado());
            pstmt.setInt(2,p.getId());
            
            int retorno = pstmt.executeUpdate();
            if ( retorno == 0 ) throw new BDException("Nenhum pedido foi atualizado");
            
        } catch (SQLException ex) {
            throw new BDException(ex);
        } finally {
            Conexao.close();
        }
    }
    
//    public static Pedido recuperaAtual(int idCliente) throws BDException {
//        Pedido p = null;
//        PreparedStatement pstmt;
//        try {
//            pstmt = Conexao.getConnection().prepareStatement("select * from pedido where pedido.id_cliente=? and pedido.fechado=false");
//
//            pstmt.setInt(1,idCliente);
//            ResultSet rs = pstmt.executeQuery();
//
//            if(rs.next()) {
//                p = new Pedido();
//                p.setFechado(rs.getBoolean("fechado"));
//                p.setId(rs.getInt("id"));
//                p.setIdCliente(rs.getInt("id_cliente"));
//            }
//
//        } catch (SQLException ex) {
////            ex.printStackTrace();
//            throw new BDException(ex);
//        }finally {
//            Conexao.close();
//        }
//        return p;
//    }
    
//    public static Pedido recupera(int id) throws BDException {
//        Pedido p = null;
//        PreparedStatement pstmt;
//        try {
//            pstmt = Conexao.getConnection().prepareStatement("select * from pedido where pedido.id=?");
//
//            pstmt.setInt(1,id);
//            ResultSet rs = pstmt.executeQuery();
//
//            if(rs.next()) {
//                p = new Pedido();
//                p.setFechado(rs.getBoolean("fechado"));
//                p.setId(rs.getInt("id"));
//                p.setIdCliente(rs.getInt("id_cliente"));
//            }
//
//        } catch (SQLException ex) {
////            ex.printStackTrace();
//            throw new BDException(ex);
//        }finally {
//            Conexao.close();
//        }
//        return p;
//    }
    
    public static Pedido recuperaAtualComItens(Cliente cli) throws BDException{
        
        Pedido p = null;
        ArrayList<ItemPedido> listaItens = new ArrayList<ItemPedido>();
        PreparedStatement pstmt;
        
        try {
            pstmt = Conexao.getConnection().prepareStatement(
                    "select pr.*, it.qtd as qtd_pedida, it.qtd*pr.preco as valor, pe.id as id_pedido, " +
                    "pe.id_cliente as id_cliente, pe.fechado as fechado, pe.id as pk_pedido " +
                    "from ( pedido as pe left outer join item_pedido as it on (it.id_pedido=pe.id) ) " +
                    "left join produto as pr on (it.num_produto=pr.id) " +
                    "where id_cliente=?  and fechado = false");
            
            pstmt.setInt(1,cli.getNumero());
            
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()){
                p = new Pedido();
                
                p.setCliente(cli);
                p.setId(rs.getInt("pk_pedido"));
                
                int idProduto = rs.getInt("id");
                
                if(idProduto != 0){
                    
                    ItemPedido ip = new ItemPedido();
                    Produto pr = new Produto();
                    
                    pr.setCodigo(rs.getString("codigo"));
                    pr.setDescricao(rs.getString("descricao"));
                    pr.setId(idProduto);
                    pr.setNome(rs.getString("nome"));
                    pr.setPreco(rs.getFloat("preco"));
                    pr.setQtd(rs.getInt("qtd"));
                    pr.setUnidade(rs.getString("unidade"));
                    
                    ip.setValor(rs.getFloat("valor"));
                    ip.setQtd(rs.getInt("qtd_pedida"));
                    ip.setProduto(pr);
                    ip.setPedido(p);
                    listaItens.add(ip);
                    
                    while (rs.next()){
                        
                        ItemPedido it = new ItemPedido();
                        Produto pro = new Produto();
                        
                        pro.setCodigo(rs.getString("codigo"));
                        pro.setDescricao(rs.getString("descricao"));
                        pro.setId(rs.getInt("id"));
                        pro.setNome(rs.getString("nome"));
                        pro.setPreco(rs.getFloat("preco"));
                        pro.setQtd(rs.getInt("qtd"));
                        pro.setUnidade(rs.getString("unidade"));
                        it.setQtd(rs.getInt("qtd_pedida"));
                        it.setValor(rs.getFloat("valor"));
                        it.setProduto(pro);
                        it.setPedido(p);
                        
                        listaItens.add(it);
                    }
                }
            }
            if(listaItens.size()>0) p.setListaItens(listaItens);
            
        } catch (SQLException ex) {
            throw new BDException(ex);
        }finally {
            Conexao.close();
        }
        return p;
    }
    
}
